package com.my.study.collection;

import java.util.*;

/**
 * 集合线程不安全案例
 */
public class ArrayListDemo {

    public static void main(String[] args) {
        //listNotSafe();
        //setNotSafe();
    }

    /**
     * HashSet线程安全问题(案列)
     * 1、问题现象:java.util.ConcurrentModificationException
     * 2、问题原因:ArrayList线程不安全,多个线程写导致并发异常
     * 3、解决办法:  用Collections.synchronizedSet
     *              ③用CopyOnWriteArraySet(读写分离思想,copy一份新的数组,每次新增一个,新增完成返回新数组),依赖CopyOnWriteArrayList实现
     * 4、底层hashmap去实现,set值存在map的key,set值value为object常量
     */
    private static void setNotSafe() {
        //Set<String> set = Collections.synchronizedSet(new HashSet<>());
        //Set<String> set = new CopyOnWriteArraySet<>();
        Set<String> set = new HashSet<>();
        for (int i = 0; i <50 ; i++) {
            new Thread(()->{
                set.add(UUID.randomUUID().toString().substring(0,8));
                System.out.println(set);
            },"test"+i).start();
        }
    }

    /**
     * ArrayList线程安全问题(案列)
     * 1、问题现象:java.util.ConcurrentModificationException
     * 2、问题原因:ArrayList线程不安全,多个线程写导致并发异常
     * 3、解决办法:  ①用vector
     *              ②用Collections.synchronizedList
     *              ③用CopyOnWriteArrayList(读写分离思想,copy一份新的数组,每次新增一个,新增完成返回新数组),用ReentrantLock去控制
     */
    private static void listNotSafe() {
        //List<String> list = Collections.synchronizedList(new ArrayList<>());
        //List<String> list = new CopyOnWriteArrayList<>();
        List<String> list = new ArrayList<>();
        for (int i = 0; i <50 ; i++) {
            new Thread(()->{
                list.add(UUID.randomUUID().toString().substring(0,8));
                System.out.println(list);
            },"test"+i).start();
        }
    }
}
